<?php
/**
 * Контроллер административной панели, реализующий управление материалами сайта
 * Класс-прокси для контроллеров материалов
 * Определяет в каком модуле находится материал и переадресовывает на контроллер соответствующего модуля
 * Если контроллер модуля не найден, работа с материалом происходит в текущем контроллере
 * 
 * @category Phorm
 * @package Controller_Module_Control
 * @name /Phorm/Controller/Module/Control/Resource.php
 * @copyright phorm.ru
 * @since 05.05.2012
 * @author vladimir@kachalov.net
 */

class Phorm_Controller_Module_Control_Resource extends Phorm_Controller_Controller {
	
	/**
	 * Экземпляр класса материалов сайта
	 * @var Phorm_Resource
	 */
	public $Resource;
	
	/**
	 * Массив данных информации о модуле материала
	 * @var array
	 */
	public $ModuleInfo;
	
	/**
	 * Массив данных материала
	 * @var array
	 */
	public $ResourceInfo;
	
	
	/**
	 * Предиспетчер
	 * 
	 * @return void
	 */
		
	public function preDispatch() {
		
		/**
		 * Инициализируем класс материалов сайта и определяем текущий модуль
		 */
		
		$this->Resource = new Phorm_Resource(null);
			
		if(isset($this->_params['moduleid'])) {
			$this->Resource->setModuleid($this->_params['moduleid']);
		}
			
		if(isset($this->_params['resourceid']) && $this->ResourceInfo = $this->Resource->getResourceInfo($this->_params['resourceid'])) {
			$this->Resource->setModuleid($this->ResourceInfo['moduleid']);
		}
		
		/**
		 * Проверяем существование MVC-ресурса (проще всего это сделать через ACl-таблицу пользователя)
		 * Если запись есть, то делаем перенаправление на соответствующий Action
		 */
			
		if(isset($this->_usersession->UserData['acl']['mvc']['control'][$this->Resource->getModuleid()][$this->_params['action']])) {
				
			return $this->_forward($this->_params['action'],$this->Resource->getModuleid(),null,
					array('controller'=>$this->Resource->getModuleid(),
						  'action'=>$this->_params['action'],
						  'isfwd'=>true));
			
		/**
		 * В противном случае работаем с текущим контроллером
		 */
			
		} else {
			
			if($this->ModuleInfo = $this->Resource->getModuleInfo($this->Resource->getModuleid())) {
			
				$this->view->assign('ModuleInfo',$this->ModuleInfo);
			
			} elseif(!in_array($this->_params['action'],array('index','generate'))) {
				
				return $this->composeErrorMessage('Материал с указанным Id не найден');
				
			}
		
		}
		
	}
	
	
	/**
	 * Главная страница - Список материалов
	 * 
	 * @return void
	 */
		
	public function indexAction() {
		
		$this->view->assign('Header',$this->_translate->_('Список ' . (empty($this->ModuleInfo) ? 'материалов сайта' : $this->ModuleInfo['genetivename']) ));
		
		$section = isset($this->_params['section']) ? $this->_params['section'] : 'index';
		
		$options = $this->Resource->getGridOptions($section);
		
		if($this->_request->isXmlHttpRequest()) {
			
			$rows = $this->Resource->getResourcesList($this->_params);
			$paginator = $this->Resource->getPaginator();
			$this->_helper->json(Phorm_JQuery_DataGrid::data($rows,$paginator,$options+$this->_params)); // В параметрах есть id модуля по которому можно подрезать список разделов в Phorm_JQuery_DataGrid::data
			
		} else {
			
			$this->view->assign('ResourceDataTable',$this->view->DataGrid('ResourceDataTable',$options));
			
		}
		
	}
	
	
	/**
	 * Создание материала
	 * 
	 * @return void
	 */
		
	public function addAction() {
		
		$this->view->assign('Header',$this->_translate->_('Создать ' . $this->ModuleInfo['singlename']));
		
		if($this->Resource->isAllowedAction('add')) {
			
			$form = $this->Resource->getResourceForm('add');
			$form->setDefaults($this->Resource->getHumanValues());
			
			if($this->_request->isPost() && $form->isValid($this->_request->getPost())) {
					
				if($this->Resource->saveResourceForm($form)) {
					if(isset($this->_params['categoryid'])) {
						$redirect = '/control/categories/index/categoryid/'.$this->_params['categoryid'].'/';
					} else {
						$redirect = '/control/resource/index/moduleid/'.$this->Resource->getModuleid().'/';
					}
					return $this->composeSuccessMessage('Материал сохранен',$redirect);
				} else {
					$this->composeTransactionErrorMessage($this->Resource->_errors);
				}
				
			}

			$this->view->assign('Form',$form);
			
		} else {
			
			return $this->composeErrorMessage('Недостаточно прав для создания материала');
			
		}
		
	}
	
	
	/**
	 * Редактирование материала
	 * 
	 * @return void
	 */
		
	public function editAction() {
		
		$this->view->assign('Header',$this->_translate->_('Редактировать ' . $this->ModuleInfo['singlename']));
			
		if($this->Resource->isAllowedAction('edit',$this->ResourceInfo['categories'],$this->ResourceInfo['creator'])) {
					
			$form = $this->Resource->getResourceForm('edit');
			$form->setDefaults($this->ResourceInfo);
					
			if($this->_request->isPost() && $form->isValid($this->_request->getPost())) {
				
				if($this->Resource->saveResourceForm($form,$this->ResourceInfo['resourceid'])) {
					if(isset($this->_params['categoryid'])) {
						$redirect = '/control/categories/index/categoryid/'.$this->_params['categoryid'].'/';
					} else {
						$redirect = '/control/resource/index/moduleid/'.$this->Resource->getModuleid().'/';
					}
					return $this->composeSuccessMessage('Изменения внесены',$redirect);
				} else {	
					$this->composeTransactionErrorMessage($this->Resource->_errors);	
				}
				
			}
					
			$this->view->assign('Form',$form);
			
		} else {
				
			return $this->composeErrorMessage('Недостаточно прав для внесения изменений');
				
		}
		
	}
	
	
	/**
	 * Удаление материала
	 * 
	 * @return void
	 */
		
	public function deleteAction() {

		// Проверяем права доступа на удаление материала
				
		if($this->Resource->isAllowedAction('delete',$this->ResourceInfo['categories'],$this->ResourceInfo['creator'])) {
				
			if($this->Resource->deleteResource($this->ResourceInfo)) {
				return $this->composeSuccessMessage('Выбранный материал удален');
			} else {
				return $this->composeDeleteErrorMessage($this->Resource->_errors);
			}
				
		} else {
			
			return $this->composeErrorMessage('Недостаточно прав для удаления материала');
					
		}
		
	}
	
	
	/**
	 * Генерация идентификатора материала
	 * 
	 * @return void
	 */
		
	public function generateAction() {

		if($this->_request->isXmlHttpRequest() && isset($this->_params['txt'])) {
			
			$this->_helper->json($this->Resource->getUidGenerated($this->_params['txt']));
			
		} else {
			
			die('error');
			
		}
		
	}
	
}